package com.bjsxt.common.util;

import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.net.ftp.FTPClient;
import org.springframework.stereotype.Component;

/**
 * FTP的工具类
 * @author WangshSxt
 *
 */
@Component("ftpUtil")
public class FtpUtil
{
	/* ip */
	private String ip = ConstatFinalUtil.CONFIG_JSON.getString("ftp.ip") ;
	/* 端口 */
	private int port = Integer.valueOf(ConstatFinalUtil.CONFIG_JSON.get("ftp.port") + "") ;
	/* 用户名 */
	private String username = ConstatFinalUtil.CONFIG_JSON.getString("ftp.username") ;
	/* 密码 */
	private String password = ConstatFinalUtil.CONFIG_JSON.getString("ftp.password"); 
	
	/* ftp客户端 */
	private FTPClient client ; 
	
	/**
	 * 登陆FTP
	 * @return
	 */
	private boolean login()
	{
		ConstatFinalUtil.SYS_LOGGER.info("---login--");
		/* 创建一个客户端 */
		client = new FTPClient();
		boolean flag = false;
		try
		{
			/* 链接 */
			client.connect(ip,port);
			/* 登陆 */
			flag = client.login(username, password);
		} catch (IOException e)
		{
			/* 报错信息,如何使用Log4j打印呢 */
			ConstatFinalUtil.SYS_LOGGER.error("登陆FTP报错了,ip:{},usersname:{}",ip,username,e);
		}
		return flag ; 
	}
	
	/**
	 * 上传文件
	 * 
	 * 当传入的fileName为/upadfile/brand/2017-06-28/uuid.jpg的时候,
	 * 我们希望ftp自动创建/upadfile/brand/2017-06-28/
	 * 
	 * @param fileName	文件的名称:uuid.jpg
	 * @param path 目录:/upadfile/brand/2017-06-28/
	 * @param is 文件的输入流
	 * @return
	 */
	public boolean uploadFile(String fileName,String path,InputStream is)
	{
		ConstatFinalUtil.SYS_LOGGER.info("---uploadFile--");
		/* 链接
		 * 登陆
		 * 切换目录
		 * 上传文件 */
		/* 登陆 */
		if(!this.login())
		{
			ConstatFinalUtil.SYS_LOGGER.error("---登陆失败了--");
			return false ;
		}
		
		try
		{
			/* 先进入到根目录 */
			client.cwd("/");
			
			/* 创建目录
			 * 目录是否存在
			 *  */
			/*把路径的所有\换成/*/
			path = path.replaceAll("\\\\", "/");
			String[] paths = path.split("/");
			for (int i = 0; i < paths.length; i++)
			{
				String pathTemp = paths[i];
				/* 创建的是父子目录 */
				if(!client.makeDirectory(pathTemp))
				{
					ConstatFinalUtil.SYS_LOGGER.error("---创建目录失败--");
				}
				
				/* 进入到该目录 */
				client.cwd(pathTemp);
			}
			
			/* 上传文件 */
			return client.storeFile(fileName, is);
		} catch (Exception e)
		{
			/* 报错信息,如何使用Log4j打印呢 */
			ConstatFinalUtil.SYS_LOGGER.error("上传文件报错了,文件名:{}",fileName,e);
		}
		return false ;
	}
}
